package com.jjrwa.utils;

import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.javadoc.PsiDocComment;
import com.jjrwa.define.IJavaFileClass;

public abstract class FileHandleUtils {

    public static PsiJavaFile getPsiJavaFile(AnActionEvent event) {

        PsiElement psiElement = event.getData(PlatformDataKeys.PSI_ELEMENT);//鼠标所在的元素
        if (psiElement == null) {
            return null;
        }
        PsiFile containingFile = psiElement.getContainingFile();
        if (containingFile == null || !(containingFile instanceof PsiJavaFile)) {
            throw new RuntimeException("请选择一个Java文件进行转换");
        }
        return (PsiJavaFile) containingFile;
    }

    public static <T extends IJavaFileClass> void createJavaFile(AnActionEvent event, String template, T data, PsiDirectory directory) {
        //创建java 文件
        WriteCommandAction.runWriteCommandAction(event.getProject(), () ->
        {
            String javaCode = FreemarkerUtils.processJavaCode(template, data);
            PsiJavaFile newJavaFile = (PsiJavaFile) PsiFileFactory.getInstance(event.getProject())
                    .createFileFromText(
                            data.fileName(),
                            JavaFileType.INSTANCE,
                            javaCode);
            directory.add(newJavaFile);
//            PsiClass javaFileClass = newJavaFile.getClasses()[0];
//            Messages.showMessageDialog(
//                    String.format("[%s]创建成功!",
//                            javaFileClass.getQualifiedName()),
//                    "Class Created Successfully",
//                    Messages.getInformationIcon()
//            );
        });
    }

    /**
     * 创建MyBatis Mapper XML文件
     * @param event 动作事件
     * @param template 模板路径（如：/templates/mapperXml.ftl）
     * @param data 数据模型（需包含namespace、resultMap等信息）
     * @param directory 目标目录（通常为resources/mapper）
     * @param fileName 文件名（不带.xml后缀）
     */
    public static <T extends IJavaFileClass> void createXmlFile(AnActionEvent event,String template,T data,PsiDirectory directory,String fileName) {
        WriteCommandAction.runWriteCommandAction(event.getProject(), () -> {
            try {
                // 1. 处理模板生成XML内容
                String xmlContent = FreemarkerUtils.processJavaCode(template, data);

                // 2. 创建XML文件
                PsiFile xmlFile = PsiFileFactory.getInstance(event.getProject())
                        .createFileFromText(
                                fileName + ".xml",  // 自动添加.xml后缀
                                StdFileTypes.XML,   // 使用XML文件类型
                                xmlContent);

                // 3. 添加到指定目录
                directory.add(xmlFile);
                // 4. 异步打开文件（避免VFS延迟问题）
                ApplicationManager.getApplication().invokeLater(() -> {
                    VirtualFile vFile = xmlFile.getVirtualFile();
                    if (vFile != null) {
                        FileEditorManager.getInstance(event.getProject())
                                .openFile(vFile, true);
                    }
                });
            } catch (Exception e) {
                Messages.showErrorDialog(
                        "XML生成失败: " + e.getMessage(),
                        "生成错误"
                );
            }
        });
    }

    public static String getAndCheckClassName(PsiDirectory directory, String className) {
        // 判断是否已经存在
        PsiFile file = directory.findFile(className + ".java");
        if (file == null) {
            return className;
        }
        className = Messages.showInputDialog(
                className + "类已存在，请输入新的类名称",
                "Build Error",
                Messages.getErrorIcon(),
                className, null);
        return getAndCheckClassName(directory, className);
    }

    public static boolean checkClassName(PsiDirectory directory, String className) {
        if (CommonUtils.isBlank(className)) {
            Messages.showErrorDialog(
                    String.format("类名不能为空！", className),
                    "Class Name Is Blank");
        }
        PsiFile file = directory.findFile(className + ".java");
        if (file == null) {
            return true;
        }
        Messages.showErrorDialog(
                String.format("类[%s]已存在，请输入新的类名", className),
                "Class Name Already Exists");
        return false;
    }

    /**
     * 读取注释，目前仅只读第一行非空白行
     *
     * @param docComment
     * @return
     */
    public static String getDocCommentText(PsiDocComment docComment) {
        if (docComment == null) {
            return "没写注释？？？";
        }
        for (PsiElement psiElement : docComment.getDescriptionElements()) {
            String text = psiElement.getText();
            if (text != null && !"".equals(text.trim())) {
                return text;
            }
        }
        return "没写注释？？？";
    }
}
